package code11_util;

import org.junit.Test;

public class TestStringBuffer {

	@Test
	public void f1() {
		// String 是不可变字符串，StringBuffer/StringBuilder 是可变字符串
		
		// 构建一个空字符串 ""
		//StringBuffer buffer = new StringBuffer();
		// 基于指定内容创建一个 StringBuffer对象
		StringBuffer buffer = new StringBuffer("tom");
		System.out.println(buffer);
		
		// 大部分的方法都会返回当前对象本身, 可以进行链式调用
		// 向末尾添加一个内容
		buffer.append("a");
		buffer.append(10);
		buffer.append("b").append(20);
		
		// 在指定位置插入字符
		buffer.insert(2, "XX");
		System.out.println(buffer);
		
		// 删除指定范围内的字符 [start, end)
		buffer.delete(4, 7);// 删3个字符
		// 删除指定位置的一个字符
		buffer.deleteCharAt(1);
		System.out.println(buffer);
		
		// 设置指定位置上的字符
		buffer.setCharAt(1, 'P');
		System.out.println(buffer);
		
		// 设置字符串的长度
		buffer.setLength(5);
		System.out.println(buffer);
		// 设置的长度超出原字符串的长度时，会再后面补空字符 '\0'
		buffer.setLength(10);
		System.out.println(buffer);
		System.out.println("length:"+buffer.length());
		
		// 反转字符串中内容
		buffer.reverse();
		System.out.println(buffer);
		System.out.println("length:"+buffer.length());
		
		// 把 StringBuffer 转为 String
		String s = buffer.toString();
		
		System.out.println(s);
		System.out.println("s.length():"+s.length());
		/*
		 * 以下的方法的使用与String相同
		 * length(),charAt(),indexOf(),lastIndexOf(),substring()
		 * replace(start, end, str) 替换指定区间内的内容 [start, end)
		 */
	}
	
	@Test
	public void f2() {
		// 删除用户输入的一行字符串中，所有下标是4的倍数的字符。
		String s = "adaeX23sXae2XsasXa34X";
		// adae_23s_ae2_sas_a34_ --> adae23sae2sasa34
		StringBuffer s1 = new StringBuffer(s);
		for (int i = 4; i < s1.length(); i++) {
			if (i%4 == 0) {
				s1.setCharAt(i, '\0');
			}
		}
		for (int i = 0; i < s1.length(); i++) {
			if(s1.charAt(i) == '\0'){
				s1.deleteCharAt(i);// 会补位
				i--;// 回退一位
			}
		}
		System.out.println(s1);
	}
	@Test
	public void f3() {
		// 接收用户输入的一行字符串(只有字母和数字)，
		// 如果输入的字符串是回文字，则输出 "是回文字",否则输出 "不是回文字"
		// 回文字: "123abccba321", "123c321"
		String s = "123abccba321";
		StringBuffer s1 = new StringBuffer(s);
		boolean f = true;// 初始值
		for (int i = 0; i < s1.length()/2; i++) {
			// 首尾对应比较
			if (s1.charAt(i) != s1.charAt(s1.length() - 1 - i)) {
				f = false;
				break;
			}
		}
		if (f) {
			System.out.println("是回文字");
		} else {
			System.out.println("不是回文字");
		}
		
		// 方式2:
		// 反转(对称的, 所以反转后的内容 和 原内容也是一样的)
		StringBuffer a1 = new StringBuffer(s);
		a1.reverse();
		
		boolean f2 = s.equals(a1.toString());
		
		System.out.println(f2 ? "是回文字":"不是回文字");
	}
	@Test
	public void t1() {
		String s1 = "";// 1515ms
		//StringBuffer s2 = new StringBuffer();// 9 ms
		StringBuilder s2 = new StringBuilder();// 5 ms
		long a = System.currentTimeMillis();// 系统时间
		for (int i = 0; i < 20000; i++) {
			//s1 += "hello";
			s2.append("hello");
		}
		long b = System.currentTimeMillis();// 系统时间
		System.out.println("耗时:" + (b-a) + " ms");
	}
	
}
